package interfaces;

import gestores.GestorInterfaces;
import gestores.ReadXMLNews;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import cliente.Cliente;
import utils.Utilities;
import dados.Accao;
import dados.Jogador;
import dados.Noticia;
import dados.Stock;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.chart.LineChart;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextAreaBuilder;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class EcranEmpresa extends VBox {

	@FXML
	private Label saldo;
	@FXML
	protected Label welcomeUser;
	@FXML
	protected Label labelAjudaPrincipal;
	@FXML
	protected Label labelAjudaJogador;
	@FXML
	private TextArea mensagemResultado;
	@FXML
	private Button aceitarOperacao;
	@FXML
	private Button cancelarOperacao;
	@FXML
	private Button ok;
	@FXML
	private HBox operacoes;
	@FXML
	private Button vender;
	@FXML
	private Button comprar;
	@FXML
	private TextField numAccoes;
	@FXML
	private TextField valorEuros;
	@FXML
	private ScrollBar slider;
	@FXML
	private Label nomeEmpresaLabel;
	@FXML
	private Label sigla;
	@FXML
	private Label valorCotacao;
	@FXML
	private Label valorVariacao;
	@FXML
	private TitledPane noticias;

	@FXML
	private TableView<Stock> tableEmpresaStock;

	@FXML
	private Label labelInfoEmpresaAccoes;

	@FXML
	private Label labelInfoEmpresaSaldo;

	@FXML
	private TitledPane TitledPaneAccoes;

	@FXML
	private LineChart<Double, Double> lineChart;

	private Stage stage;
	private Cliente cliente;
	private GestorInterfaces interfaces;
	private Stock stock;
	private Accao accao;
	private Jogador jogador;
	private URI url;
	private URI ajuda;
	@FXML
	private Hyperlink link;

	public EcranEmpresa(Stage stage, Cliente cliente,
			GestorInterfaces interfaces, Stock stock, Accao accao,
			Jogador jogador) {
		this.cliente = cliente;
		this.stage = stage;
		this.interfaces = interfaces;
		this.accao = accao;
		this.stock = stock;
		this.jogador = jogador;
		criarJanelaEmpresa();
	}

	public void criarJanelaEmpresa() {
		FXMLLoader ecranEmpresa = new FXMLLoader(getClass().getResource(
				"EcranEmpresa.fxml"));
		ecranEmpresa.setRoot(this);
		ecranEmpresa.setController(this);

		try {
			ecranEmpresa.load();
			adicionarNrAccoesJogador();

		} catch (IOException exception) {
			throw new RuntimeException(exception);
		}

		URL rss;
		try {
			rss = new URL("http://finance.yahoo.com/rss/headline?s=" + stock.getSigla() + "");
			System.out.println("URL: " + rss);
			ReadXMLNews xml = new ReadXMLNews(rss);
			stock.setNoticias(xml.init());
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("JANELA EMPRESA");
		preencherValores();
		validarBotoes();
		preencherNoticias();
		
		try {
			url = new URI("http://" + link.getText());
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		
		try {
			ajuda = new URI("http://46.137.99.16/myStock/Ajuda.jsp");
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		
		stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
		    @Override
		    public void handle(WindowEvent event) {
		    	System.exit(0);
		    }
		});
	}

	public void preencherNoticias() {
		ScrollPane scrollPane = new ScrollPane();
		VBox box = new VBox();
		int i = 0;
		for (Noticia n : stock.getNoticias()) {

			TextArea text = TextAreaBuilder.create().wrapText(true).build();

			text.setText(i + " Titulo - " + n.getTitulo() + "\n"
					+ "Descricao - " + n.getDescricao() + "\n" + "Link - "
					+ n.getLink() + "\n" + "Data de publicacao - "
					+ n.getPubDate());
			text.setPrefHeight(text.getText().length() / 2);
			box.getChildren().add(text);
			i++;
		}
		scrollPane.setContent(box);
		scrollPane.setFitToWidth(true);
		//
		// VBox vBox = VBoxBuilder.create().children(scrollPane).build();
		noticias.setContent(scrollPane);
	}

	public void preencherValores() {
		numAccoes.setText("0");
		valorEuros.setText("0.00$");
		saldo.setText(Utilities.roundTo2DecimalsString(cliente.getJogador()
				.getSaldo()) + "$");
		System.out.println("Saldo: " + cliente.getJogador().getSaldo());
		nomeEmpresaLabel.setText(stock.getNome());
		welcomeUser.setText(cliente.getJogador().getNome());
		sigla.setText("" + stock.getSigla());
		valorCotacao.setText(Utilities.roundTo2DecimalsString(stock
				.getCotacao()) + " $");
		if (stock.getVariacao() < 0) {
			valorVariacao.setTextFill(Color.RED);
		} else if (stock.getVariacao() > 0) {
			valorVariacao.setTextFill(Color.GREEN);
		}
		valorVariacao.setText(Utilities.roundTo2DecimalsString(stock
				.getVariacao()) + " %");
	}

	@FXML
	 public void irParaSite(ActionEvent e) {
		 try {
			java.awt.Desktop.getDesktop().browse(url);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
   }
	
	@FXML
	public void perfilJogadorUserLabel(MouseEvent event) {
		stage.close();
		interfaces.ecranJogador(new Stage());
	}

	@FXML
	public void ecranInicialHomeImage(MouseEvent event) {
		stage.close();
		interfaces.ecranInicial(new Stage());
	}

	@FXML
	public void ExitOption(ActionEvent event) {
		interfaces.ecranSair(new Stage());
	}

	@FXML
	public void opcaoAjuda(ActionEvent event) {
		 try {
			java.awt.Desktop.getDesktop().browse(ajuda);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	@FXML
	public void logOut(MouseEvent event) {
		interfaces.ecranLogout(new Stage());
	}

	@FXML
	public void mostrarLabelAjudaPrincipal(MouseEvent evente) {
		labelAjudaPrincipal.setOpacity(1);
	}

	@FXML
	public void mostrarLabelAjudaJogador(MouseEvent evente) {
		labelAjudaJogador.setOpacity(1);
	}

	@FXML
	public void esconderLabelAjudaPrincipal(MouseEvent evente) {
		labelAjudaPrincipal.setOpacity(0);
	}

	@FXML
	public void esconderLabelAjudaJogador(MouseEvent evente) {
		labelAjudaJogador.setOpacity(0);
	}

	public void validarBotoes() {
		try {
			if (Integer.parseInt(numAccoes.getText()) == 0
					|| numAccoes.getText().isEmpty()
					|| numAccoes.getText().equals('0')) {
				comprar.setDisable(true);
				vender.setDisable(true);
			} else {
				comprar.setDisable(false);
				if (cliente.getGestorTransaccoes().temAccao(accao)
						&& cliente.getGestorTransaccoes().temMaisAccoes(accao,
								Integer.parseInt(numAccoes.getText())) == false) {
					vender.setDisable(true);
					labelInfoEmpresaAccoes.setOpacity(1.0);
				} else if (!cliente.getGestorTransaccoes().temAccao(accao)) {
					vender.setDisable(true);
					labelInfoEmpresaAccoes.setOpacity(1.0);
				} else {
					vender.setDisable(false);
					labelInfoEmpresaAccoes.setOpacity(0.0);
				}
			}
		} catch (NumberFormatException e) {
			System.out
					.println("EcranEmpresa - ValidarBotoes() - NumberFormatException");
		}
	}

	@FXML
	public void comprarButton(ActionEvent event) {
		try {
			double accoes = Double.parseDouble((String) numAccoes.getText());

			vender.setDisable(true);
			comprar.setDisable(true);
			slider.setDisable(true);
			numAccoes.setDisable(true);

			mensagemResultado.setOpacity(1);
			operacoes.setOpacity(1);

			actualizarValor();
			validarBotoes();

			if (accoes == 0.0) {
				cancelarOperacao.setOpacity(0);
				mensagemResultado
						.setText("Tem de inserir um valor superior a 0");
				ok.setDisable(false);
				ok.setOpacity(1);
				cancelarOperacao.setOpacity(0);
				aceitarOperacao.setOpacity(0);
			} else {
				mensagemResultado.setText("Deseja comprar "
						+ numAccoes.getText() + " accoes, no valor de "
						+ valorEuros.getText() + " ?");
				// gestorTransaccao = new GestorTransaccao(accoes, s);
				cancelarOperacao.setOpacity(1);
				aceitarOperacao.setOpacity(1);
				validarBotoes();
			}
		} catch (NumberFormatException e) {
			System.out
					.println("EcranEmpresa(comprarButton): ERRO - Formato errado");
			numAccoes.setText("0");
		}
	}

	@FXML
	public void venderButton(ActionEvent event) {
		try {
			double accoes = Double.parseDouble((String) numAccoes.getText());
			vender.setDisable(true);
			comprar.setDisable(true);
			slider.setDisable(true);
			numAccoes.setDisable(true);

			mensagemResultado.setOpacity(1);
			operacoes.setOpacity(1);

			actualizarValor();
			validarBotoes();

			if (accoes == 0.0) {
				cancelarOperacao.setOpacity(0);
				mensagemResultado
						.setText("Tem de inserir um valor superior a 0");
				ok.setDisable(false);
				ok.setOpacity(1);
				cancelarOperacao.setOpacity(0);
				aceitarOperacao.setOpacity(0);
			} else {
				mensagemResultado.setText("Deseja vender "
						+ numAccoes.getText() + " accoes, no valor de "
						+ valorEuros.getText() + " ?");
				// gestorTransaccao = new GestorTransaccao(accoes, s);
				cancelarOperacao.setOpacity(1);
				aceitarOperacao.setOpacity(1);
				validarBotoes();
			}

		} catch (NumberFormatException e) {
			System.out
					.println("EcranEmpresa(venderButton): ERRO - Formato errado");
			numAccoes.setText("0");
		}
	}

	@FXML
	public void aceitarOperacao(ActionEvent evet) {

		validarBotoes();

		if (mensagemResultado.getText().contains("comprar")) {
			System.out.println("Comprar");
			// stock.getJogador().novaAccao(gestorTransaccao.getAccao());
			if (cliente.getGestorTransaccoes().comprarAccao(stock, Integer.parseInt(numAccoes.getText()))) {
				mensagemResultado.setText("A sua operacao foi efectuada!");
				saldo.setText(jogador.getSaldo() + "$");
				accao = cliente.accaoJogador(stock);
				cliente.guardar();
				validarBotoes();
				adicionarNrAccoesJogador();
				System.out.println("Accoes: "
						+ cliente.getJogador().getAccoes());
			}
			// mensagemResultado.setText(stock.getJogador().comprarAccao(gestorTransaccao.getAccao()));
			cancelarOperacao.setOpacity(0);
			aceitarOperacao.setOpacity(0);
			ok.setOpacity(1);
			ok.setDisable(false);

		} else if (mensagemResultado.getText().contains("vender")) {
			System.out.println("Vender");
			// stock.getJogador().retirarAccao(gestorTransaccao.getAccao());
			if (cliente.getGestorTransaccoes().venderAccao(accao, stock,
					Integer.parseInt(numAccoes.getText()))) {
				mensagemResultado.setText("A sua operacao foi efectuada!");
				saldo.setText(jogador.getSaldo() + "$");
				validarBotoes();
				adicionarNrAccoesJogador();
				cliente.guardar();
			}
			// mensagemResultado.setText(stock.getJogador().venderAccao(gestorTransaccao.getAccao()));
			cancelarOperacao.setOpacity(0);
			aceitarOperacao.setOpacity(0);
			ok.setOpacity(1);
			ok.setDisable(false);
		}
	}

	@FXML
	public void okButton(ActionEvent event) {
		ok.setDisable(true);
		ok.setOpacity(0);
		comprar.setDisable(false);
		slider.setDisable(false);
		numAccoes.setDisable(false);
		mensagemResultado.setOpacity(0);
		operacoes.setOpacity(0);
		mensagemResultado.clear();
		validarBotoes();
	}

	@FXML
	public void cancelarOperacao(ActionEvent evet) {
		mensagemResultado.setText("A sua operacao foi cancelada!");
		aceitarOperacao.setText("OK");
		cancelarOperacao.setOpacity(0);
		aceitarOperacao.setOpacity(0);
		ok.setOpacity(1);
		ok.setDisable(false);
		validarBotoes();
	}

	@FXML
	public void sliderEvent(MouseEvent event) {
		numAccoes.setText("" + (int) slider.getValue());
		double total = ((int) slider.getValue() * stock.getCotacao());
		valorEuros.setText(Utilities.roundTo2DecimalsString(total) + "$");
		actualizarValor();
		validarBotoes();
	}

	@FXML
	public void valorDeAccoes(KeyEvent event) {
		actualizarValor();
		validarBotoes();
	}

	public void actualizarValor() {
		System.out.println("Accoes" + numAccoes.getText());
		if (numAccoes.getText() != null || numAccoes.getText() != "") {
			System.out.println("pois...");
			try {
				double total = Integer.parseInt(numAccoes.getText())
						* stock.getCotacao();
				valorEuros.setText(Utilities.roundTo2DecimalsString(total)
						+ "$");
				if (total > cliente.getJogador().getSaldo()) {
					labelInfoEmpresaSaldo.setOpacity(1.0);
					comprar.setDisable(true);
				} else {
					labelInfoEmpresaSaldo.setOpacity(0.0);
					comprar.setDisable(false);
				}
			} catch (NumberFormatException e) {
				System.out.println("Formato Errado");
				valorEuros.setText("0$");
			}
		}
	}

	public void adicionarNrAccoesJogador() {
		if (accao == null) {
			TitledPaneAccoes
					.setText("Numero de Accoes - Nao tem accoes desta empresa");
		} else {
			TitledPaneAccoes.setText("Numero de Accoes desta empresa: "
					+ accao.getQuantidade());
		}
	}

}